package com.ch02.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 *@ClassName MyBatisSqlSessionFactory
 *@Description  TODO
 *@Author Kx
 *@Date 2025/4/21 20:18
 *@Version 1.0
 */
public class MyBatisSqlSessionFactory {
    // 声明一个静态变量sqlSessionFactory，用于创建SqlSession
    private static SqlSessionFactory sqlSessionFactory;

    /***
     * @author: kx
     * @date: 2025/4/22 7:59
     * @return org.apache.ibatis.session.SqlSessionFactory: 用于创建SqlSession
     * @description: 读取配置文件mybatis-config.xml获取对象实例,使用单例模式确保唯一性,减少资源
    */
    public static SqlSessionFactory getSqlSessionFactory(){
        try {
            // 判断sqlSessionFactory是否为空
            if (sqlSessionFactory == null) {
                // 从类路径下获取mybatis-config.xml配置文件的字节流
                InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
                // 使用SqlSessionFactoryBuilder和配置文件的字节流构建SqlSessionFactory
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return sqlSessionFactory;
    }


    /***
     * @author: kx
     * @date: 2025/4/22 8:39
     * @return org.apache.ibatis.session.SqlSession : 返回SqlSession对象,用于执行数据库操作
     * @description: 打开并返回一个SqlSession实例
     * 此方法用于简化数据库会话的创建过程，通过调用SqlSessionFactory的openSession方法来创建SqlSession
     * SqlSession提供了与数据库交互的接口，包括执行SQL语句、提交或回滚事务以及获取映射器等
    */
    public static SqlSession openSession() {
        return getSqlSessionFactory().openSession();
    }
}
